<?php
/**
 * Date: 2017/12/4
 * Time: 13:35
 * Author: zeronlee
 */
namespace App\Models\Access\User\Traits;

use App\Models\Ogz;
use App\Models\App;
use App\Models\Access\Role\Role;
use App\Services\Handle\Handle;

trait UserOgz{
    /**
     * 保存
     *
     * @param  mixed  $inputOgzs
     * @return void
     */
    public function saveOgz($inputOgzs)
    {
        if (! empty($inputOgzs)) {
            $this->Ogzs()->sync($inputOgzs);
        } else {
            $this->Ogzs()->detach();
        }
    }

    /**
     * 用户绑定机构
     *
     * @param  object|array $ogz
     * @return void
     */
    public function attachOgz($ogz)
    {
        if (is_object($ogz)) {
            $ogz = $ogz->getKey();
        }

        if (is_array($ogz)) {
            $ogz = $ogz['id'];
        }

        $this->ogzs()->attach($ogz);
    }

    /**
     * 用户分离机构
     *
     * @param  object|array $ogz
     * @return void
     */
    public function detachOgz($ogz)
    {
        if (is_object($ogz)) {
            $ogz = $ogz->getKey();
        }

        if (is_array($ogz)) {
            $ogz = $ogz['id'];
        }

        $this->ogzs()->detach($ogz);
    }

    /**
     * 用户管辖机构,一个用户管辖多个机构,职权标准
     * 是机构联系人,子集合是多列并集
     *
     * @param $withTrash 是否查询已禁用
     * @return array
     */
    public function hasOgzs($withTrash)
    {
        $hasOgzs = [];

        $Handle = new Handle();
        $currentAction = $Handle->getCurrentAction();
        //审核员，管理员可以查看所有漏洞rols->all=2[hasPart]
        if($this->hasAll() || $this->hasPart()){

            $hasOgzs = $this->hasAllOgzs($withTrash);
        } else {
            //机构联系人
            $Ogzs = Ogz::getOgzByUser($this->id);
            foreach ($Ogzs as $ogz){
                //所在机构
                $hasOgzs[] = $ogz->id;
                //下属机构
                $temp = Ogz::getChild($ogz->id,'id',$withTrash);

                $hasOgzs = array_merge($hasOgzs,Ogz::getChildNoLayer($temp));
            }
        }
        return array_unique($hasOgzs);
    }

    /**
     * 越权机构,key是当前机构
     *
     * @param $withTrash 是否查询已禁用
     * @return array
     */
    public function parentOgzs ($withTrash) {
        $parentOgzs = [];

        //机构联系人
        $Ogzs = Ogz::getOgzByUser($this->id);
        foreach ($Ogzs as $ogz) {
            if ($this->hasAll()) {
                return [$ogz->id => [0]];
            }
            $parentOgzs[$ogz->id] = Ogz::getParent($ogz->pid) ? Ogz::getParent($ogz->pid) : [0];

        }

        return $parentOgzs;
    }

    /**
     * 拥有所有
     * @param $withTrash 是否查询已禁用
     * @return array
     */
    public function hasAllOgzs($withTrash=false)
    {
        $all = [];
        //所有机构
        if ($withTrash){
            $allOgzs = Ogz::withTrashed()->get();
        }else{
            $allOgzs = Ogz::all();
        }

        $all = $allOgzs->pluck('id')->toArray();

        return $all;
    }
}